package demo02;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.stream.IntStream;

public class VirtualThreadDemo {

    private static final int TASK_COUNT = 10000; // 模拟10000个并发任务
    private static final int IO_WAIT_MILLIS = 100; // 模拟每个任务的I/O等待时间

    public static void main(String[] args) throws InterruptedException {
        System.out.println("--- 传统平台线程示例 ---");
        long platformThreadStartTime = System.currentTimeMillis();
        runWithPlatformThreads();
        long platformThreadEndTime = System.currentTimeMillis();
        System.out.println("传统平台线程完成时间: " + (platformThreadEndTime - platformThreadStartTime) + " ms\n");

        System.out.println("--- 虚拟线程示例 ---");
        long virtualThreadStartTime = System.currentTimeMillis();
        runWithVirtualThreads();
        long virtualThreadEndTime = System.currentTimeMillis();
        System.out.println("虚拟线程完成时间: " + (virtualThreadEndTime - virtualThreadStartTime) + " ms");
    }

    // 使用传统平台线程
    private static void runWithPlatformThreads() throws InterruptedException {
        // 限制线程池大小，因为创建大量平台线程开销很大，可能导致OOM
        // 在实际应用中，如果任务数量远超线程池大小，会出现任务排队等待，降低吞吐量
        try (ExecutorService executor = Executors.newFixedThreadPool(100)) { // 假设最大并发100个平台线程
            IntStream.range(0, TASK_COUNT).forEach(i -> executor.submit(() -> {
                try {
                    // 模拟I/O密集型操作，例如网络请求、数据库查询
                    Thread.sleep(IO_WAIT_MILLIS);
                    // System.out.println("平台线程任务 " + i + " 完成"); // 打印会影响性能，此处注释
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            }));
            executor.shutdown();
            executor.awaitTermination(1, TimeUnit.MINUTES);
        }
    }

    // 使用虚拟线程
    private static void runWithVirtualThreads() throws InterruptedException {
        // 使用虚拟线程，可以创建大量线程，几乎没有开销
        try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor()) {
            IntStream.range(0, TASK_COUNT).forEach(i -> executor.submit(() -> {
                try {
                    // 模拟I/O密集型操作
                    Thread.sleep(IO_WAIT_MILLIS);
                    // System.out.println("虚拟线程任务 " + i + " 完成"); // 打印会影响性能，此处注释
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            }));
            executor.shutdown();
            executor.awaitTermination(1, TimeUnit.MINUTES);
        }
    }
}